package com.gjy.sentinel.core;


import com.gjy.sentinel.core.demo.*;
import com.gjy.sentinel.core.sentinel.RuleLoader;

import java.io.IOException;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * Sentinel‑Core（1.8.8）完整示例
 * 演示：Flow、Degrade、System、ParamFlow、Authority 五类规则以及
 * 动态加载/刷新、限流入口（SphU.entry / ContextUtil）等核心 API。
 * <p>
 * 运行方式（Maven）：
 * mvn compile exec:java -Dexec.mainClass=com.example.sentinel.SentinelDemo
 * <p>
 * 依赖：sentinel‑core:1.8.8
 */
public class Application {

    /** 演示所有功能的入口（可单独运行） */
    public static void main(String[] args) throws IOException, InterruptedException {
        // 1️⃣ 加载规则（文件方式）
        RuleLoader.loadAll();

        // 2️⃣ 启动一个线程池，循环调用各 demo 来演示限流/降级/系统保护等
        ExecutorService pool = Executors.newFixedThreadPool(8);
        CountDownLatch latch = new CountDownLatch(30);

        for (int i = 0; i < 30; i++) {
            final int idx = i;
            pool.submit(() -> {
                try {
                    FlowDemo.tryAccess();                             // 普通限流
                    ParamFlowDemo.tryAccess(idx % 5);                 // 热点限流 (0~4)
                    DegradeDemo.tryCall();                            // 降级（熔断）
                    SystemDemo.tryEnter();                            // 系统保护
                    AuthorityDemo.tryAccess(idx % 5);                 // 访问控制 (白名单 0,1,2)
                } finally {
                    latch.countDown();
                }
            });
        }

        latch.await();
        pool.shutdownNow();
        System.out.println("\n=== Demo 完成 ===");
    }

}
